1   /*
2    * Copyright (C) 2013 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.google.common.collect;
18  
19  import com.google.common.annotations.GwtCompatible;
20  import com.google.common.annotations.GwtIncompatible;
21  import com.google.common.collect.MultimapBuilder.MultimapBuilderWithKeys;
22  
23  import junit.framework.TestCase;
24  
25  import java.io.ByteArrayInputStream;
26  import java.io.ByteArrayOutputStream;
27  import java.io.ObjectInputStream;
28  import java.io.ObjectOutputStream;
29  import java.math.RoundingMode;
30  import java.util.SortedMap;
31  import java.util.SortedSet;
32  
33  /**
34   * Tests for {@link MultimapBuilder}.
35   *
36   * @author Louis Wasserman
37   */
38  @GwtCompatible(emulated = true)
39  public class MultimapBuilderTest extends TestCase {
40  
41    @GwtIncompatible("doesn't build without explicit type parameters on build() methods")
42    public void testGenerics() {
43      ListMultimap<String, Integer> a = MultimapBuilder.hashKeys().arrayListValues().build();
44      SortedSetMultimap<String, Integer> b = MultimapBuilder.linkedHashKeys().treeSetValues().build();
45      SetMultimap<String, Integer> c =
46          MultimapBuilder.treeKeys(String.CASE_INSENSITIVE_ORDER).hashSetValues().build();
47    }
48  
49    public void testGenerics_gwtCompatible() {
50      ListMultimap<String, Integer> a =
51          MultimapBuilder.hashKeys().arrayListValues().<String, Integer>build();
52      SortedSetMultimap<String, Integer> b =
53          MultimapBuilder.linkedHashKeys().treeSetValues().<String, Integer>build();
54      SetMultimap<String, Integer> c = MultimapBuilder.treeKeys(String.CASE_INSENSITIVE_ORDER)
55          .hashSetValues().<String, Integer>build();
56    }
57  
58    @GwtIncompatible("doesn't build without explicit type parameters on build() methods")
59    public void testTreeKeys() {
60      ListMultimap<String, Integer> multimap = MultimapBuilder.treeKeys().arrayListValues().build();
61      assertTrue(multimap.keySet() instanceof SortedSet);
62      assertTrue(multimap.asMap() instanceof SortedMap);
63    }
64  
65    public void testTreeKeys_gwtCompatible() {
66      ListMultimap<String, Integer> multimap =
67          MultimapBuilder.treeKeys().arrayListValues().<String, Integer>build();
68      assertTrue(multimap.keySet() instanceof SortedSet);
69      assertTrue(multimap.asMap() instanceof SortedMap);
70    }
71  
72    @GwtIncompatible("serialization")
73    public void testSerialization() throws Exception {
74      for (MultimapBuilderWithKeys<?> builderWithKeys : ImmutableList.of(
75          MultimapBuilder.hashKeys(), MultimapBuilder.linkedHashKeys(), MultimapBuilder.treeKeys(),
76          MultimapBuilder.enumKeys(RoundingMode.class))) {
77        for (MultimapBuilder<?, ?> builder : ImmutableList.of(
78            builderWithKeys.arrayListValues(),
79            builderWithKeys.linkedListValues(),
80            builderWithKeys.hashSetValues(),
81            builderWithKeys.linkedHashSetValues(),
82            builderWithKeys.treeSetValues(),
83            builderWithKeys.enumSetValues(RoundingMode.class))) {
84          /*
85           * Temporarily inlining SerializableTester here for obscure internal reasons.
86           */
87          reserializeAndAssert(builder.build());
88        }
89      }
90    }
91  
92    @GwtIncompatible("serialization")
93    private static void reserializeAndAssert(Object object) throws Exception {
94      Object copy = reserialize(object);
95      assertEquals(object, copy);
96      assertEquals(object.getClass(), copy.getClass());
97    }
98  
99    @GwtIncompatible("serialization")
100   private static Object reserialize(Object object) throws Exception {
101     ByteArrayOutputStream bytes = new ByteArrayOutputStream();
102     new ObjectOutputStream(bytes).writeObject(object);
103     return new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray())).readObject();
104   }
105 }